﻿using Microsoft.Practices.EnterpriseLibrary.Caching;

namespace CommonComponents.Cache
{
    /// <summary>
    /// Es una implementación de ICacheManager utilizando un string como llave de los
    /// valores asociados y ESPECIFICAMENTE utilizando el CacheApplicationBlock
    /// </summary>
    public class CacheManager : ICacheManager<string>
    {

        /// <summary>
        /// Creo un nuevo CacheManager de CacheApplicationBlock
        /// </summary>
        public CacheManager()
        {
            _manager = CacheFactory.GetCacheManager();
        }

        /// <summary>
        /// Cache Manager de application block
        /// </summary>
        readonly ICacheManager _manager;

        /// <summary>
        /// Obtener un valor del Cache Manager
        /// </summary>
        /// <param name="key">Llave asocida al valor</param>
        /// <returns>Valor buscado</returns>
        public object this[string key]
        {
            get { return _manager[key]; }
        }

        /// <summary>
        /// Obtiene un valor del Cache Manager
        /// </summary>
        /// <param name="key">Llave asociada al valor</param>
        /// <returns>Valor buscado</returns>
        public object Get(string key)
        {
            return _manager[key];
        }

        /// <summary>
        /// Agrega un valor al cache manager asociado con una llave
        /// </summary>
        /// <param name="key">LLave asociada</param>
        /// <param name="value">Valor a agregar</param>
        public void Add(string key, object value)
        {
            _manager.Add(key, value);
        }

        /// <summary>
        /// Verifica si la llave dada contiene algun valor
        /// </summary>
        /// <param name="key">Llave a verificar</param>
        /// <returns>Verdadero si contiene un valor, sino falso</returns>
        public bool Contains(string key)
        {
            return _manager.Contains(key);
        }

        /// <summary>
        /// Quita el valor asociado a una llave
        /// </summary>
        /// <param name="key">LLave asociada</param>
        public void Remove(string key)
        {
            _manager.Remove(key);
        }

        /// <summary>
        /// Remueve todos los elementos del cache manager interno
        /// </summary>
        public void Flush()
        {
            _manager.Flush();
        }

    }
}
